#include <iostream>
using std::cout;
using std::endl;

#define MAX 100

void test0(){
    //const常量本质上还是当成变量处理
    //但是加上了只读属性
    //初始化之后不能再修改其值
    const int max = 100;
    /* max -= 1; */
    cout << max - 1 << endl;

    //const常量必须在初始化时赋初值
    /* const int num; */
    /* num = 100; */

    const int number1 = 10;
    int const number2 = 20;
}

void test1(){
    int num1 = 1;
    int num2 = 2;
    //const在*的左边
    //称为指向常量的指针（pointer to const）
    //能够修改指针的指向，但是不能通过指针修改其指向的值
    const int * p = &num1;
    cout << *p << endl;
    /* *p = 100; */
    p = &num2;
    cout << *p << endl;
    /* num1 = 100;//ok */

    int const * p2 = &num1;
    /* *p2 = 100; */
    p2 = &num2;
    /* *p2 = 200; */
    /* num2 = 200; //ok */

    //指向常量的指针才能去指向常量
    const int num = 10;
    const int * p3 = &num;
}

void test2(){
    int num1 = 1;
    int num2 = 2;
    //const在*的右边
    //称为常量指针（const pointer）
    //从右往左读，先看到const再看到*
    //可以通过指针修改其指向的值
    //不能修改指针的指向
    int * const p = &num1;
    *p = 100;
    cout << num1 << endl;
    /* p = &num2; */
}

//数组指针
void test3(){
    int arr[5] = {1,2,3,4,5};
    /* int * p = &arr[0]; */
    /* int * p2 = arr; */
    cout << &arr[0] << endl;
    cout << arr + 1 << endl;

    //数组指针指向数组的首地址
    //控制范围是整个数组的空间
    /* int * p3 = &arr;//error */
    int (*p3)[5] = &arr;//ok
    cout << &arr + 1 << endl;
    
    for(int i = 0; i < 5; ++i){
        cout << (*p3)[i] << endl;
    }
}

//指针数组
//保存元素为指针变量的数组
void test4(){
    int num1 = 6,num2 = 7,num3 = 8;
    int * p1 = &num1;
    int * p2 = &num2;
    int * p3 = &num3;
    int* arr[3] = {p1,p2,p3};
    for(int i = 0; i < 3; ++i){
        cout << *arr[i] << endl;
    }
}


//函数指针
void print(int x){
    cout << "print:" << x << endl;
}

void test5(){
    //定义函数指针时要确定其指向的函数的返回类型与参数信息
    //省略形式
    void (*p)(int) = print;
    p(6);

    //完整形式
    void (*p2)(int) = &print;
    (*p2)(7);
}

//指针函数
//函数的返回类型是指针类型
//返回的指针指向的内容的生命周期要长于函数
int num = 100;

int * func(){
    int * p = &num;
    return p;
}

void test6(){
    cout << *func() << endl;
}


int main(void){
    test6();
    return 0;
}
